#include "funciones.h"
/**
 * @brief posicionInicial Coloca a cada jugador en su posición inicial dependiendo del lado de juego.
 * @param jugador Jugador a colocar.
 *
 * Según el dorsal cada jugador tendrá una posición y acturá en consecuencia.
 * Dorsal 2 --> Defensa Lateral Derecho
 * Dorsal 3 --> Defensa Central Derecho
 * Dorsal 4 --> Defensa Central Izquierdo
 * Dorsal 5 --> Defensa Lateral Izquierdo
 * Dorsal 6 --> Medio Lateral Derecho
 * Dorsal 7 --> Medio Central Derecho
 * Dorsal 8 --> Medio central Izquierdo
 * Dorsal 9 --> Medio Lateral Izquierdo
 * Dorsal 10--> Delantero Izquierdo
 * Dorsal 11--> Delantero Derecho
 */
void posicionInicial(Jugador &jugador)
{
    usleep(100000);


    switch (jugador.getnumero())
    {
    case 2:  //LATERAL DERECHO
    {
        jugador.colocar(-27,25);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(-15);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.pos_inicial.setX(-27);
        jugador.pos_inicial.setY(25);

        break;
    }
    case 3:  //CENTRAL DERECHO
    {
        jugador.colocar(-30,8);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.pos_inicial.setX(-30);
        jugador.pos_inicial.setY(8);
        break;
    }
    case 4:  //CENTRAL IZQUIERDO
    {
        jugador.colocar(-30,-8);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.pos_inicial.setX(-30);
        jugador.pos_inicial.setY(-8);
        break;
    }
    case 5:  //LATERAL IZQUIERDO
    {
        jugador.colocar(-27,-25);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(15);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.pos_inicial.setX(-27);
        jugador.pos_inicial.setY(-25);
        break;
    }
    case 6:  //MEDIO DERECHO
    {
        jugador.colocar(-13,32);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(-20);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.pos_inicial.setX(-13);
        jugador.pos_inicial.setY(32);
        break;
    }
    case 7: //MEDIOCENTRO DERECHO
    {
        jugador.colocar(-20,6);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.pos_inicial.setX(-20);
        jugador.pos_inicial.setY(6);
        break;
    }
    case 8: //MEDIOCENTRO IZQUIERDO
    {
        jugador.colocar(-20,-6);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.pos_inicial.setX(-20);
        jugador.pos_inicial.setY(-6);
        break;
    }
    case 9: //MEDIO IZQUIERDO
    {
        jugador.colocar(-13,-32);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(20);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.pos_inicial.setX(-13);
        jugador.pos_inicial.setY(-32);
        break;
    }
    case 10: //DELANTERO DERECHO
    {
        jugador.colocar(-2,-11);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(30000);
        jugador.girar(50);
        jugador.pos_inicial.setX(-2);
        jugador.pos_inicial.setY(-11);
        break;
    }
    case 11: //DELANTERO IZQUIERDO
    {
        jugador.colocar(-2,11);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.girar(-50);
        jugador.cliente.enviar(jugador.msg.str());
        usleep(15000);
        jugador.pos_inicial.setX(-2);
        jugador.pos_inicial.setY(11);
        break;
    }
    }
    if (jugador.datos.getSide() == "r")
    {
        sleep(1);
        jugador.cliente.enviar("(turn 180)");
        jugador.pos_inicial.setX(jugador.pos_inicial.getX()*(-1));
        jugador.pos_inicial.setY(jugador.pos_inicial.getY()*(-1));
    }
    cout<<"Posicion inicial teórica: ";
    jugador.pos_inicial.printPunto();
    cout<<endl;
}

/**
 * @brief zonaPortero Determina si el portero está en su zona de juego o no.
 * @param portero Variable portero.
 * @return Devuelve TRUE si el portero está en su zona.
 */
bool zonaPortero(Jugador &portero)
{
    bool in = true;
    double x = portero.posicion.getX();
    double y = portero.posicion.getY();
    if (portero.datos.getSide() == "l")
    {
        if(-52.5 < x && x < -35 && -20 < y &&  y < 20)
            in = true;
        else
            in = false;
    }
    else
    {
        if(35 < x && x < 52.5 && -20 < y && y < 20)
            in = true;
        else
            in = false;
    }
    return in;
}

/**
 * @brief zonaJugador Determina si un jugador está en su zona de juego o no.
 * @param jugador Jugador a evaluar.
 * @return Devuelve TRUE si el jugador está dentro de su zona.
 */
bool zonaJugador(Jugador &jugador)
{
    bool in = true;
    double x = jugador.posicion.getX();
    double y = jugador.posicion.getY();
    if (jugador.datos.getSide() == "l")
    {
        switch (jugador.getnumero())
        {
        case 2:
            if (-52.5 < x && x < -25 && 0 < y && y < 34)
                in = true;
            else
            {
                if(-25 <= x && x < 10 && 20 < y && y < 34)
                    in = true;
                else
                    in = false;
            }
            break;
        case 3:
            if (-52.5 < x && x < 0 && 0 < y && y < 20)
                in = true;
            else
                in = false;
            break;
        case 4:
            if (-52.5 < x && x < 0 && 0 > y && y > -20){
                in = true;}
            else{
                in = false;}
            break;
        case 5:
            if (-52.5 < x && x < -25 && 0 > y && y > -34){
                in = true;}
            else
            {
                if(-25 <= x && x < 10 && -20 > y && y > -34){
                    in = true;}
                else{
                    in = false;
                }}
            break;
        case 6:
            if (-30 < x && x < 30 && 0 < y && y < 34)
                in = true;
            else
            {
                if(30 <= x && x < 52.5 && 10 < y && y < 34)
                    in = true;
                else
                    in = false;
            }
            break;
        case 7:
            if (-30 < x && x < 30 && 0 < y && y < 20)
                in = true;
            else
                in = false;
            break;
        case 8:
            if (-30 < x && x < 30 && -20 < y && y < 0)
                in = true;
            else
                in = false;
            break;
        case 9:
            if (-30 < x && x < 30 && -34 < y && y < 0)
                in = true;
            else
            {
                if(30 <= x && x < 52.5 && -34 < y && y < -10)
                    in = true;
                else
                    in = false;
            }
            break;
        case 11:
            if (-10 < x && x < 52.5 && -10 < y && y < 34)
                in = true;
            else
                in = false;
            break;
        case 10:
            if (-10 < x && x < 52.5 && -34 < y && y < 10)
                in = true;
            else
                in = false;
            break;
        }
    }
    else
    {
        switch (jugador.getnumero())
        {
        case 2:
            if (52.5 > x && x > 25 && 0 > y && y > -34)
                in = true;
            else
            {
                if(25 >= x && x > -10 && 20 > y && y > -34)
                    in = true;
                else
                    in = false;
            }
            break;
        case 3:
            if (52.5 > x && x > 0 && 0 > y && y > -20)
                in = true;
            else
                in = false;
            break;
        case 4:
            if (52.5 > x && x > 0 && 0 < y && y < 20){
                in = true;}
            else{
                in = false;}
            break;
        case 5:
            if (52.5 > x && x > 25 && 0 < y && y < 34){
                in = true;}
            else
            {
                if(25 >= x && x > -10 && -20 < y && y < 34){
                    in = true;}
                else{
                    in = false;
                }}
            break;
        case 6:
            if (30 > x && x > -30 && 0 > y && y > -34)
                in = true;
            else
            {
                if(-30 >= x && x > -52.5 && 10 > y && y > -34)
                    in = true;
                else
                    in = false;
            }
            break;
        case 7:
            if (30 > x && x >- 30 && 0 > y && y > -20)
                in = true;
            else
                in = false;
            break;
        case 8:
            if (30 > x && x > -30 && 20 > y && y > 0)
                in = true;
            else
                in = false;
            break;
        case 9:
            if (30 > x && x > -30 && 34 > y && y > 0)
                in = true;
            else
            {
                if(-30 >= x && x > -52.5 && 10 < y && y < 34)
                    in = true;
                else
                    in = false;
            }
            break;
        case 11:
            if (10 > x && x > -52.5 && -34 < y && y < 10)
                in = true;
            else
                in = false;
            break;
        case 10:
            if (10 > x && x > -52.5 && -10 < y && y < 34)
                in = true;
            else
                in = false;
            break;
        }
    }
    return in;
}

/**
 * @brief balonZonaJugador Determina si el balón está dentro de la zona de un determinado jugador.
 * @param jugador Jugador a evaluar.
 * @param balon Posición de la pelota.
 * @return Devuelve TRUE si la pelota está dentro de la zona del jugador.
 *
 * En función del aréa que tiene delimitada cada jugador para moverse observamos si la pelota está dentro de esta.
 * Le añadimos un error de +-2 metros para compensar el error producido por el cálculo de la posicion y así poder
 * utilizar también este área para realizar los saque de banda y corner.
 */

bool balonZonaJugador(Jugador &jugador, Punto balon)
{
    bool in = true;
    double x = balon.getX();
    double y = balon.getY();
    if (jugador.datos.getSide() == "l")
    {
        switch (jugador.getnumero())
        {
        case 2:
            if (-54.5 < x && x < -27 && -2 < y && y < 36)
                in = true;
            else
            {
                if (-27 <= x && x < 12 && 18 < y && y < 36)
                    in = true;
                else
                    in = false;
            }
            break;
        case 3:
            if (-54.5 < x && x < 2 && -2 < y && y < 22)
                in = true;
            else
                in = false;
            break;
        case 4:
            if (-54.5 < x && x < 2 && -2 > y && y > -22)
                in = true;
            else
                in = false;
            break;
        case 5:
            if (-54.5 < x && x < -27 && -2 > y && y > -32)
                in = true;
            else
            {
                if(-27 <= x && x < 12 && -22 > y && y > -32)
                    in = true;
                else
                    in = false;
            }
            break;
        case 6:
            if (-32 < x && x < 32 && -2 < y && y < 36)
                in = true;
            else
            {
                if(28 <= x && x < 54.5 && 8 < y && y < 36)
                    in = true;
                else
                    in = false;
            }
            break;
        case 7:
            if (-32 < x && x < 32 && -2 < y && y < 22)
                in = true;
            else
                in = false;
            break;
        case 8:
            if (-32 < x && x < 32 && -22 < y && y < 2)
                in = true;
            else
                in = false;
            break;
        case 9:
            if (-32 < x && x < 32 && -36 < y && y < 2)
                in = true;
            else
            {
                if(28 <= x && x < 54.5 && -32 < y && y < -8)
                    in = true;
                else
                    in = false;
            }
            break;
        case 11:
            if (-12 < x && x < 54.5 && -12 < y && y < 36)
                in = true;
            else
                in = false;
            break;
        case 10:
            if (-12 < x && x < 54.5 && -36 < y && y < 12)
                in = true;
            else
                in = false;
            break;
        }
    }
    else
    {
        switch (jugador.getnumero())
        {
        case 2:
            if (54.5 > x && x > 27 && -36 < y && y < 2)
                in = true;
            else
            {
                if (27 >= x && x > -12 && -36 < y && y < -18)
                    in = true;
                else
                    in = false;
            }
            break;
        case 3:
            if (54.5 > x && x > -2 && -22 < y && y < 2)
                in = true;
            else
                in = false;
            break;
        case 4:
            if (54.5 > x && x > -2 && 22 > y && y > 2)
                in = true;
            else
                in = false;
            break;
        case 5:
            if (54.5 > x && x > 27 && 32 > y && y > 2)
                in = true;
            else
            {
                if(27 >= x && x > -12 && 32 > y && y > 22)
                    in = true;
                else
                    in = false;
            }
            break;
        case 6:
            if (32 > x && x > -32 && -36 < y && y < 2)
                in = true;
            else
            {
                if(-28 >= x && x > -54.5 && -36 < y && y < -8)
                    in = true;
                else
                    in = false;
            }
            break;
        case 7:
            if (32 > x && x > -32 && -22 < y && y < 2)
                in = true;
            else
                in = false;
            break;
        case 8:
            if (32 > x && x > -32 && -2 < y && y < 22)
                in = true;
            else
                in = false;
            break;
        case 9:
            if (32 > x && x > -32 && -2 < y && y < 36)
                in = true;
            else
            {
                if(-28 >= x && x > -54.5 && 8 < y && y < 32)
                    in = true;
                else
                    in = false;
            }
            break;
        case 11:
            if (12 > x && x > -54.5 && -36 < y && y < 12)
                in = true;
            else
                in = false;
            break;
        case 10:
            if (12 > x && x > -54.5 && -12 < y && y < 36)
                in = true;
            else
                in = false;
            break;
        }
    }
    return in;
}

/**
 * @brief volverZonaJugador Función para llevar a un jugador de nuevo a su posición de juego.
 * @param jugador Jugador a mover.
 */
void volverZonaJugador(Jugador &jugador)
{
    jugador.goTo(jugador.pos_play);
}


/**
 * @brief colocarJugador Con esta función colocaremos a los jugadores tras cada evento indicado por el arbitro
 * @param jugador Jugador a colocar.
 */
/*void colocarJugador(Jugador &jugador)
{
    Punto posBalon;
    posBalon = jugador.posicionPelota();
    double x = posBalon.getX();
    double y = posBalon.getY();
    double posPlayX = jugador.pos_play.getX();
    double posPlayY = jugador.pos_play.getY();

    if (jugador.refereeMode == 3) //Nuestro equipo saca de banda
    {
        switch (jugador.getnumero())
        {
        case 2:
            if (balonZonaJugador(jugador,posBalon))
                jugador.goTo(x,y);
            else
            {
                if(y > 0)
                    jugador.goTo(0,30);
                else
                    jugador.goTo(-10,20);
            }
            break;
        case 3:
            if(x > 0)
                jugador.goTo(posPlayX+10,posPlayY+10);
            else
                jugador.goTo(posPlayX,posPlayY);
            break;
        case 4:
            if(x > 0)
                jugador.goTo(posPlayX+10,posPlayY+10);
            else
                jugador.goTo(posPlayX,posPlayY);
            break;
            break;
        case 5:
            if (balonZonaJugador(jugador,posBalon))
                jugador.goTo(x,y);
            else
            {
                if(y > 0)
                    jugador.goTo(0,-30);
                else
                    jugador.goTo(-10,-20);
            }
            break;
        case 6:
            if ((balonZonaJugador(jugador,posBalon) == true) && (x > 11))
                jugador.goTo(posBalon.getX(),posBalon.getY());
            else
            {
                if(10 < x)
                    jugador.goTo(x+7,y-3);
                if(y < 0)
                    jugador.goTo(posPlayX,posPlayY);
            }
            break;
        case 7:
            if(x > 0 && y > 0)
                jugador.goTo(x-4,y-5);
            else
                jugador.goTo(x-10,posPlayY);
            break;
        case 8:
            if(x > 0 && y < 0)
                jugador.goTo(x-4,y-5);
            else
                jugador.goTo(x-10,posPlayY);
            break;
        case 9:
            if ((balonZonaJugador(jugador,posBalon) == true) && (x > 11))
                jugador.goTo(x,y);
            else
            {
                if(10 < x)
                    jugador.goTo(x+7,y+3);
                if(y > 0)
                    jugador.goTo(posPlayX,posPlayY);
            }
            break;
        case 10:
            if(x > 0 && y > 0)
                jugador.goTo(x+4,y-5);
            else
                jugador.goTo(posPlayX,posPlayY);
            break;
        case 11:
            if(x > 0 && y < 0)
                jugador.goTo(x+4,y+5);
            else
                jugador.goTo(posPlayX,posPlayY);
            break;
        }
    }

    if (jugador.refereeMode == 4) //Contrario saca de banda
    {
       jugador.goTo(posPlayX,posPlayY);
    }

    if (jugador.refereeMode == 5) //Nuestro equipo saca falta
    {
        switch (jugador.getnumero())
        {
        case 2:
            if (balonZonaJugador(jugador,posBalon))
                jugador.goTo(x-2,y+1);
            else
            {
                if(y > 0)
                    jugador.goTo(0,30);
                else
                    jugador.goTo(-10,20);
            }
            break;
        case 3:
            if(balonZonaJugador(jugador,posBalon))
                jugador.goTo(posPlayX,posPlayY);
            else
                jugador.goTo(0,posPlayY);
            break;
        case 4:
            if(balonZonaJugador(jugador,posBalon))
                jugador.goTo(posPlayX,posPlayY);
            else
                jugador.goTo(0,posPlayY);
            break;
        case 5:
            if (balonZonaJugador(jugador,posBalon))
                jugador.goTo(x-2,y-1);
            else
            {
                if(posBalon.getY() < 0)
                    jugador.goTo(0,-30);
                else
                    jugador.goTo(-10,-20);
            }
            break;
        case 6:
            if (balonZonaJugador(jugador,posBalon))
            {
                if (x > 11)
                    jugador.goTo(x-2,y+1);
                if (-25 < x && x < 11 && y < 20)
                    jugador.goTo(x-2,y+1);
            }
            else
            {
                if(10 < x)
                    jugador.goTo(x+7,y+3);
                if(posBalon.getY() < 0)
                    jugador.goTo(posPlayX,posPlayY);
            }
            break;
        case 7:
            if(posBalon.getX() > 0 && posBalon.getY() > 0)
                jugador.goTo(x-4,y-5);
            else
                jugador.goTo(x-10,posPlayY);
            break;
        case 8:
            if(x > 0 && y < 0)
                jugador.goTo(x-4,y-5);
            else
                jugador.goTo(x-10,posPlayY);
            break;
        case 9:
            if (balonZonaJugador(jugador,posBalon))
            {
                if (x > 11)
                    jugador.goTo(x-2,y-1);
                if (-25 < x && x < 11 && y > -20)
                    jugador.goTo(x-2,y-1);
            }
            else
            {
                if(10 < x)
                    jugador.goTo(x+7,y+3);
                if(x > 0)
                    jugador.goTo(posPlayX,posPlayY);
            }
        case 10:
            if(x > 0 && y > 0)
                jugador.goTo(x+10,y+5);
            else
                jugador.goTo(posPlayX,posPlayY);
            break;
        case 11:
            if(x > 0 && y < 0)
                jugador.goTo(x+10,y-5);
            else
                jugador.goTo(posPlayX,posPlayY);
            break;
        }
    }

    if (jugador.refereeMode == 6) //Contrario saca falta
    {
        jugador.goTo(posPlayX,posPlayY);
    }

    if (jugador.refereeMode == 7) //Nuestro equipo saca corner
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.goTo(0,15);
            break;
        case 3:
            jugador.goTo(-3,5);
            break;
        case 4:
            jugador.goTo(-3,-5);
            break;
        case 5:
            jugador.goTo(0,-15);
            break;
        case 6:
            if(y > 0)
                jugador.goTo(x,y+1);
            else
                jugador.goTo(48,5);
            break;
        case 7:
            jugador.goTo(41.5,0);
        case 8:
            jugador.goTo(15,0);
            break;
        case 9:
            if(y < 0)
                jugador.goTo(x,y-1);
            else
                jugador.goTo(48,-5);
            break;
        case 10:
            jugador.goTo(49,5.5);
            break;
        case 11:
            jugador.goTo(50,8);
            break;
        }
    }

    if (jugador.refereeMode == 8) //Contrario saca corner
    {
        switch (jugador.getnumero())
        {
        case 2:
            jugador.goTo(-50, 2);
            break;
        case 3:
            jugador.goTo(-48,5);
            break;
        case 4:
            jugador.goTo(-48,-5);
            break;
        case 5:
            jugador.goTo(-50,-2);
            break;
        case 6:
            jugador.goTo(-40,1.5);
            break;
        case 7:
            jugador.goTo(-48,1);
            break;
        case 8:
            jugador.goTo(-48,-1);
            break;
        case 9:
            jugador.goTo(-40,-1.5);
            break;
        case 10:
            jugador.goTo(-35,0);
            break;
        case 11:
            jugador.goTo(-15,0);
            break;
        }
    }

    if (jugador.refereeMode == 9) //Nuestro equipo saca de puerta
    {
        jugador.goTo(posPlayX,posPlayY);
    }

    if (jugador.refereeMode == 10) //Equipo contrario saca de puerta
    {
        jugador.goTo(posPlayX,posPlayY);
    }

    if (jugador.refereeMode == 11) //BEFORE KICK_OFF

    {
        jugador.colocar(posPlayX,posPlayY);
    }

    if (jugador.refereeMode == 12) //Nuestro equipo saca offside
    {
        switch (jugador.getnumero())
        {
        case 2:
            if(y > 0)
                jugador.goTo(x,y);
            else
                jugador.goTo(posPlayX,posPlayY);
            break;
        case 3:
            jugador.goTo(posPlayX,posPlayY);
            break;
        case 4:
            jugador.goTo(posPlayX,posPlayY);
        case 5:
            if(y < 0)
                jugador.goTo(x,y);
            else
                jugador.goTo(posPlayX,posPlayY);
            break;
        case 6:

            jugador.goTo(posPlayX+5,posPlayY);
            break;
        case 7:
            jugador.goTo(posPlayX,posPlayY);
            break;
        case 8:
            jugador.goTo(posPlayX,posPlayY);
            break;
        case 9:
            jugador.goTo(posPlayX+5,posPlayY);
            break;
        case 10:
            jugador.goTo(posPlayX+5,posPlayY);
            break;
        case 11:
            jugador.goTo(posPlayX+5,posPlayY);
            break;
        }
    }

    if (jugador.refereeMode == 13) //Equipo contrario saca offside
    {
        jugador.goTo(posPlayX,posPlayY);
    }

    if (jugador.refereeMode == 14) //Half time
    {
        jugador.goTo(posPlayX,posPlayY);
    }
}*/

/**
 * @brief sacarDeCentro El jugador nº10 saca de centro.
 * @param jugador Variable jugador.
 */
void sacarDeCentro(Jugador &jugador)
{  
    if(jugador.getnumero() == 10 )
    {
        jugador.seguirPelota();
        usleep(15000);
    }
    else
        usleep(15000);
}
